linux | 您所在的位置:网站首页 › solved squashfs error unable to read page size › linux |
我正在使用带有内置 NAND 闪存的嵌入式 ARM 平台。我的屋顶分区是 squashfs。 u-boot 和内核都使用 OMAP_ECC_BCH8_CODE_HW。问题是一些板(不只是一 block )在停电后停止工作(它们使用了大约 2 个月)。 启动时可以看到这些错误: [ 8.270507] end_request: I/O error, dev mtdblock9, sector 25184 [ 8.278930] SQUASHFS error: squashfs_read_data failed to read block 0xc40396 [ 8.286376] SQUASHFS error: Unable to read fragment cache entry [c40396] [ 8.293579] SQUASHFS error: Unable to read page, block c40396, size d696 [ 8.300628] SQUASHFS error: Unable to read fragment cache entry [c40396] [ 8.307647] SQUASHFS error: Unable to read page, block c40396, size d696 [ 8.314819] SQUASHFS error: Unable to read fragment cache entry [c40396] [ 8.321838] SQUASHFS error: Unable to read page, block c40396, size d696 [ 8.328887] SQUASHFS error: Unable to read fragment cache entry [c40396] [ 8.335906] SQUASHFS error: Unable to read page, block c40396, size d696 [ 8.343017] SQUASHFS error: Unable to read fragment cache entry [c40396] [ 8.350006] SQUASHFS error: Unable to read page, block c40396, size d696 /usr/sbin/lighttpd: '/usr/lib/libpcre.so.1' is not an ELF file /usr/sbin/lighttpd: can't load library 'libpcre.so.1'我应该如何调试它?我没有删除闪存,所以仍然可以对其进行一些测试。 到目前为止我做了什么: 我在坏分区上使用 nanddump(带 -o,读取 oob 数据),我注意到三个 ecc 更正警告。当我将此转储写入另一 block 板时,它可以顺利启动。 当我将 nanddump 与附加选项 -n(--noecc,不纠错读取)一起使用并将其写入另一 block 板(使用 nandwrite -n)时,第二 block 板无法启动。 在我看来,这些错误是可以恢复的,这就是 nanddump 在第一种情况下纠正它们的原因。我比较了这 2 个转储,它们只有三个差异(nanddump 报告了 3 个 ecc 更正?) # diff mtd_without_ecc.hex mtd_with_ecc.hex 486347c486347 < 076bca0: 59d2 d8bc 3e89 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs --- > 076bca0: 59d2 d8bc 3e09 1c67 a6c2 74a0 bc38 4873 Y...>..g..t..8Hs 783769c783769 < 0bf5980: e31e f50a e5b5 6ae5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. --- > 0bf5980: e31e f50a e5b5 6aa5 5a67 8be1 7636 9cf2 ......j.Zg..v6.. 1315929c1315929 < 1414580: a9ec ef89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A --- > 1414580: a9ec af89 ac52 c8a5 61f5 5d0b 6ee2 af41 .....R..a.].n..A问题是:为什么这些错误没有被系统自动纠正?是因为 squashfs 不是“mtd-aware”文件系统,它不应该在 mtd 设备上使用吗?如果是这样,我应该在 UBI 上使用 squashfs 吗?那么内核呢(据我所知,它必须是原始镜像才能从 u-boot 启动它)? 感谢您的帮助! 最佳答案 事实上,Linux MTD 层不对 NAND/NOR 内存做任何维护。 例如,当您的 NAND 上发生位翻转时,它会被 ECC 纠正。 MTD 层知道这一点,但它不会对此做任何事情。它只是返回错误。 因此您需要在 MTD 之上的另一层来处理这个问题。 一种解决方案是使用 UBI,它旨在解决此类问题。看看 UBI documentation在 linux-mtd 上。如果你想坚持使用 squashfs,可以在 UBI (gluebi) 之上添加另一个 MTD 抽象,然后在其之上运行 squashfs。结果看起来像这样: --------------------- | SquashFS | --------------------- | MTD block | --------------------- | MTD API (gluebi) | --------------------- | UBI | --------------------- | MTD driver | --------------------- | Flash Chip | ---------------------它制作了一张可怕的图片,但效果很好;) 看看this slides from free-electrons了解更多信息(图片来自幻灯片 47)。 关于内核,我不确定,但我认为 U-Boot 确实支持 UBI。虽然从未尝试过... 关于linux - SQUASHFS 错误 : Unable to read page, ...,大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551600/ |
CopyRight 2018-2019 实验室设备网 版权所有 |